#include "semirrecta2d.h"

Semirrecta2d::Semirrecta2d()
{

}

Semirrecta2d::Semirrecta2d(const Punto2d& origen, const Angulo& angulo) :
    Recta2d(origen, angulo)
{
}

Semirrecta2d::Semirrecta2d(const Punto2d& origen, const Punto2d& otroPunto) :
    Recta2d(origen, otroPunto)
{
   
}

Semirrecta2d::Semirrecta2d(const Punto2d& origen, const Vector2d& direccion) :
    Recta2d(origen, direccion)
{
}

Punto2d Semirrecta2d::interseccion(const Recta2d& otraRecta) const
{    
    Punto2d interseccion = Recta2d::interseccion(otraRecta);
    if (!interseccion.esValido()) {
        return interseccion;
    }

    if (this->contiene(interseccion) && otraRecta.contiene(interseccion)) {
        return interseccion;
    } else {
        return Punto2d();
    }
}

bool Semirrecta2d::contiene(const Punto2d& punto) const
{
    if (!Recta2d::contiene(punto)) {
        return false;
    }
    Vector2d v = Vector2d(getOrigen(), punto);
    return fequals(v.getAngulo().getGrados(), getDireccion().getAngulo().getGrados());
}

/**
 * Calcula la semirecta perpendicular a esta recta que pasa por un punto.
 */
Semirrecta2d Semirrecta2d::semirrectaPerpendicular(const Recta2d& recta, const Punto2d& punto)
{
    Recta2d rectaPermendicular = recta.perpendicular(punto);
    return Semirrecta2d(punto, recta.interseccion(rectaPermendicular));
}